package com.xjh.basestudy.javabase.thread_final.threadlocal.demo;

/**
 * @Author:XuJianHua
 * @Date:2022/10/27
 * @Description: 在线程中创建局部变量
 *
 */
public class ThreadLocalDemo_1 {
  // 创建一个ThreadLocal类型的变量，注意这个变量并不是在线程中创建的，但是是在线程中获取的

  private static ThreadLocal<String> localVar = new ThreadLocal<String>();

  static void print(String str) {
    //打印当前线程中本地内存中本地变量的值
    System.out.println(str + " :" + localVar.get());
    //清除本地内存中的本地变量
//    localVar.remove();
  }

  public static void main(String[] args) throws InterruptedException {
    /**
     * 1.创建一个线程
     * 2.获取一个threadLocal类型的变量并设置值
     * 3.将值打印出来发现是设置的值
     * 4.将值删除
     *
     *
     * */
    new Thread(new Runnable() {
      public void run() {
        ThreadLocalDemo_1.localVar.set("local_A");
        print("A");
        //打印本地变量
        System.out.println("after remove : " + localVar.get());

      }
    }, "A").start();

    Thread.sleep(1000);

    new Thread(new Runnable() {
      public void run() {
        System.out.println("没有remove 还是null " + localVar.get());
        ThreadLocalDemo_1.localVar.set("local_B");
        print("B");
        System.out.println("after remove : " + localVar.get());

      }
    }, "B").start();
  }


 /**
  *  ThreadLocal的set()方法原理：
  *
  * public void set(T value) {
  *         //1、获取当前线程
  *         Thread t = Thread.currentThread();
  *         //2、获取线程中的属性 threadLocalMap ,如果threadLocalMap 不为空，
  *         //则直接更新要保存的变量值，否则创建threadLocalMap，并赋值
  *         ThreadLocalMap map = getMap(t);
  *         if (map != null)
  *             map.set(this, value);
  *         else
  *             // 初始化thradLocalMap 并赋值
  *             createMap(t, value);
  *     }
  *
  *
  * ThreadLocal的get方法原理：
  *
  *  public T get() {
  *         //1、获取当前线程
  *         Thread t = Thread.currentThread();
  *         //2、获取当前线程的ThreadLocalMap
  *         ThreadLocalMap map = getMap(t);
  *         //3、如果map数据不为空，
  *         if (map != null) {
  *             //3.1、获取threalLocalMap中存储的值
  *             ThreadLocalMap.Entry e = map.getEntry(this);
  *             if (e != null) {
  *                 @SuppressWarnings("unchecked")
  *                 T result = (T)e.value;
  *                 return result;
  *             }
  *         }
  *         //如果是数据为null，则初始化，初始化的结果，TheralLocalMap中存放key值为threadLocal，值为null
  *         return setInitialValue();
  *     }
  *
  *
  * */



}
